//
//  trajectory.h
//  map-matching
//
//  Created by Lv Xin on 16/4/13.
//  Copyright © 2016年 Lv Xin. All rights reserved.
//

#ifndef trajectory_h
#define trajectory_h

#include "node.h"
#include "edge.h"
#include "map.h"
#include "trajectory_generated.h"
#include <stdio.h>
#include <vector>
#include <list>

struct TraPosNode{
    DoublePos pos;
    int direct;//由北顺时针旋转的角度
};

struct EdgeDis{
    std::vector<Edge> edge;//相同路名的边放在一个vector里面
    double dis;
};

struct Route{
    int* rank;
    void init(int T){
        rank = new int[T];
    }
    void input(int* m, int T){
        for(int i = 0; i < T; i++)
            rank[i] = m[i];
    }
    Route(){}
    ~Route(){
        delete []rank;
    }
};

class Trajectary{//这里是每个原始路径
    int T;
    int* tempRoute;
    std::vector<TraPosNode> tra;
    //std::vector<GenerateTrajectory> generateTraj;//最终生成的候选路径，通过相似度匹配选择
    Map* mapSet;
    double lenT;
public:
    Trajectary();
    Trajectary(Map*);
    ~Trajectary();
    void setMap(Map*);
    void addPos(DoublePos, int);
    void fileAddPos(std::string);//从文件中读入，格式为经纬度相隔开
    void generateOnePointCandidateEdge(int rank);//对于一个点生成候选的小边
    void generateCandidateEdge();//生成候选路径上的小边
    //void getGenerateTraj();//由候选路径的小边生成最终的候选路径
    void getCandidateR(int rank);//在基础策略之后生成候选集，即generateCandidateEdge之后执行
    bool ifGridAndPointDisSmallerThanDmax(int rankP, int rankx, int ranky);//判断该网格与该点的最短距离是否小于Dmax
    bool ifAllEdgeAroundPointIsTheSameRoad(int rank);//判断这个点附近的边是不是全是一个路径,通过首尾是否一致来判定
    int getTraSize(){return tra.size();}
    Edge convertDirect(Edge, int);
    static int convertPosToDirect(double lat, double lng, double latEnd, double lngEnd);
    friend class TR_SIM;
    friend class FilterTree;
    friend class CutTraj;
};

#endif /* trajectory_h */
